home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / Writeswell Jr. 1.0.2 Master / Writeswell Jr. Source / PrintWWJr.c < prev    next >
Text File  |  1992-12-30  |  7KB  |  328 lines

  1. /* PrintWWJr.c
  2.  * Handle printing in Writeswell Jr.
  3.  *
  4.  * ©1992 Working Software, Inc.
  5.  * This source code is copyrighted.  Permission is granted to use the Word Services
  6.  * portion of the Writeswell Jr. source code in your own programs, but you 
  7.  * may not distribute the Writeswell Jr. word-processor code as a 
  8.  * commercial product.  If you modify the code, please do not call it 
  9.  * Writeswell Jr. (or Writeswell.)  This will ensure that people understand the 
  10.  * program and don’t have to deal with a number of different versions with 
  11.  * who-knows-what going on in the code.
  12.  * 
  13.  * Writeswell Jr. and Writeswell are trademarks of Working Software, Inc.
  14.  *
  15.  * 17 Oct 92 Mike Crawford - The third anniversary of the Loma Prieta Earthquake.
  16.  *                            Downtown Santa Cruz is still under reconstruction.
  17.  */
  18.  
  19. #include <EPPC.h>
  20. #include <AppleEvents.h>
  21. #include <AEObjects.h>
  22. #include <Printing.h>
  23. #include "AERegistry.h"
  24. #include "WordServices.h"
  25. #include "TestBed.h"
  26. #include "TBConstants.h"
  27. #include "Gripe.h"
  28. #include "Scroll.h"
  29. #include "Prefs.h"
  30. #include "TBGlobals.h"
  31. #include "PrintWWJr.h"
  32. #include "UnloadStuff.h"
  33. #include "PageSetup.h"
  34.  
  35. void PostPrintingErrors( OSErr theErr );
  36. void PrintPage( Rect rPage, short pageNumber, Boolean *morePages );
  37. void MakePrinterText( THPrint thePrRecHdl );
  38. void SetPrintRect( Rect *rPagePtr );
  39. void SetWindowRect( void );
  40.  
  41. static Rect    gOldDestRect;
  42. static Rect gOldViewRect;
  43.  
  44. void DoPrint( void )
  45. {
  46.     GrafPtr        oldPort;
  47.     short        copies;
  48.     short        firstPage;
  49.     short        lastPage;
  50.     short        numberOfCopies;
  51.     short        printmgrsResFile;
  52.     short        realNumberOfPagesInDoc;
  53.     short        pageNumber;
  54.     short        printError;
  55.     THPrint        thePrRecHdl;
  56.     TPPrPort    thePrPort;
  57.     TPrStatus    theStatus;
  58.     Rect        rPage;
  59.     Boolean        morePages;
  60.  
  61.     GetPort( &oldPort );
  62.  
  63.     thePrRecHdl = GetPrintRecord();
  64.  
  65.     if ( !thePrRecHdl ){
  66.         Gripe( "\pCannot get print record" );
  67.         return;
  68.     }
  69.  
  70.     UnloadForPrint();
  71.         
  72.     PrOpen();
  73.     
  74.     if ( PrError() == noErr ){
  75.     
  76.         printmgrsResFile = CurResFile();
  77.         
  78.         if ( PrJobDialog( thePrRecHdl ) ){
  79.         
  80.             numberOfCopies = (**thePrRecHdl).prJob.iCopies;
  81.             firstPage = (**thePrRecHdl).prJob.iFstPage;
  82.             lastPage = (**thePrRecHdl).prJob.iLstPage;
  83.                     
  84.             /* STUB show printing status dialog */
  85.             
  86.             for ( copies = 1; copies <= numberOfCopies; copies++ ){
  87.             
  88.                 /* STUB install idle proc */
  89.                 
  90.                 /* Restore the resource file to the printer driver */
  91.                 
  92.                 UseResFile( printmgrsResFile );
  93.                 
  94.                 thePrPort = PrOpenDoc( thePrRecHdl,
  95.                                         (TPPrPort)NULL,
  96.                                         (Ptr)NULL );
  97.                 
  98.                 pageNumber = firstPage;
  99.                 
  100.                 rPage = (**thePrRecHdl).prInfo.rPage;
  101.                 
  102.                 SetPrintRect( &rPage );        /* Set TE Rec to fit on printer paper */
  103.  
  104.                 morePages = true;
  105.  
  106.                 while ( pageNumber <= lastPage && morePages && PrError() == noErr ){
  107.                     PicHandle    thePict;
  108.                     GrafPtr        curPort;
  109.                     
  110.                     GetPort( &curPort );
  111.                     SetPort( gDocWindow );
  112.                 
  113.                     thePict = OpenPicture( &rPage );
  114.                     
  115.                     /*ClipRect( &(thePort->portRect) );*/
  116.                     /*ClipRect( &rPage );*/
  117.                     
  118.                     if ( !thePict ){
  119.                         PrSetError( memFullErr );
  120.                     }else{
  121.                         PrintPage( rPage, pageNumber, &morePages );
  122.                         ClosePicture();
  123.                         
  124.                         SetPort( curPort );
  125.  
  126.                         PrOpenPage( thePrPort, (TPRect)NULL );
  127.                         
  128.                         if ( PrError() == noErr ){
  129.                             DrawPicture( thePict, &rPage );
  130.                         }
  131.                         
  132.                         PrClosePage( thePrPort );
  133.                         
  134.                         DisposeHandle( thePict );
  135.                     }
  136.                     pageNumber++;
  137.                 }/* while pageNumber */
  138.                 
  139.                 SetWindowRect();            /* Restore TE Rec to fit in window */
  140.  
  141.                 PrCloseDoc( thePrPort );
  142.             }/* for copies */
  143.         }else{
  144.             /* The print job is being canceled by the user
  145.              * from the job dialog
  146.              */
  147.             PrSetError( iPrAbort );
  148.         }
  149.     }/* If PrError */
  150.     
  151.     printError = PrError();
  152.     
  153.     PrClose();
  154.     
  155.     /* 1.0.2 Check for iPrAbort - user canceled Job dialog or pressed Cmd Dot */
  156.  
  157.     if ( printError != noErr && printError != iPrAbort )
  158.         PostPrintingErrors( printError );
  159.     
  160.     ReleaseResource( thePrRecHdl );
  161.     
  162.     /* STUB dispose of progress dialog */
  163.  
  164.     SetPort( oldPort );
  165.  
  166.     return;
  167. }
  168.  
  169. void PostPrintingErrors( OSErr theErr )
  170. {
  171.     /* STUB Explain what the error really was */
  172.     
  173.     Gripe( "\pAn error occurred while printing" );
  174.  
  175.     return;
  176. }
  177.  
  178. void SetPrintRect( Rect *rPagePtr )
  179. {
  180.     TEHandle    textH;
  181.  
  182.     /* Resize the TextEdit record's dest and view rects to fit the printer paper */
  183.  
  184.     textH = (TEHandle)GetWRefCon( gDocWindow );
  185.     
  186.     gOldDestRect = (*textH)->destRect;
  187.     gOldViewRect = (*textH)->viewRect;
  188.     
  189.     (*textH)->destRect = *rPagePtr;
  190.     (*textH)->viewRect = *rPagePtr;
  191.  
  192.     TECalText( textH );
  193.  
  194.     return;
  195. }
  196.  
  197. void SetWindowRect( void )
  198. {
  199.     TEHandle    textH;
  200.     GrafPtr        curPort;
  201.     
  202.     /* Restore the TE rec's original view and dest rects */
  203.  
  204.     GetPort( &curPort );
  205.     SetPort( gDocWindow );
  206.  
  207.     textH = (TEHandle)GetWRefCon( gDocWindow );
  208.     
  209.     (*textH)->destRect = gOldDestRect;
  210.     (*textH)->viewRect = gOldViewRect;
  211.  
  212.     TECalText( textH );
  213.  
  214.     /* Force a redraw of the text */
  215.     InvalRect( &gOldViewRect );
  216.     
  217.     SetPort( curPort );
  218.  
  219.     return;
  220. }
  221.  
  222. void PrintPage( Rect rPage, short pageNumber, Boolean *morePages )
  223. {
  224.     TEHandle    textH;
  225.     GrafPtr        curPort;
  226.     Rect        clipRect;
  227.     short        docHeight;
  228.     short        pageHeight;
  229.     Rect        viewRect;
  230.     Rect        destRect;
  231.  
  232.     textH = (TEHandle)GetWRefCon( gDocWindow );
  233.  
  234.     docHeight = TEGetHeight( 1, (*textH)->nLines, textH );
  235.     
  236.     pageHeight = rPage.bottom - rPage.top;
  237.     
  238.     if ( pageHeight * pageNumber > docHeight ){
  239.         *morePages = false;
  240.     }else{
  241.         *morePages = true;
  242.     }
  243.  
  244.     SetRect( &clipRect, 0, 0, 0, 0 );
  245.     ClipRect( &clipRect );
  246.     
  247.     viewRect = (*textH)->viewRect;
  248.     destRect = (*textH)->destRect;
  249.  
  250.     TEScroll( 0, viewRect.top - destRect.top, textH );
  251.     TEScroll( 0, - ( pageHeight * (pageNumber - 1) ), textH );
  252.  
  253.     clipRect = rPage;
  254.  
  255. /*
  256.     clipRect.top += (pageHeight * (pageNumber - 1) );    
  257.     clipRect.bottom += (pageHeight * (pageNumber - 1) );
  258. */
  259.  
  260.     ClipRect( &clipRect );
  261.  
  262.     TEUpdate( &rPage, textH );
  263.             
  264.     return;
  265. }
  266.  
  267. #ifdef NEVER
  268. void MakePrinterText( THPrint thePrRecHdl )
  269. {
  270.     Rect            destRect;
  271.     Rect            viewRect;
  272.     CharsHandle        textHdl;
  273.     TEStyleHandle    stylHdl;
  274.     TEHandle        winTEHdl;
  275.     long            textLen;
  276.     short            oldStart;
  277.     short            oldEnd;
  278.  
  279.     /* If there are any errors, we post them into the printer manager, so
  280.      * that upon return, the error is checked and we will exit the printing loop.
  281.      * I think that should work properly.
  282.      *
  283.      * It will have the advantage that the printing loop will be entirely exited
  284.      * before the error is actually displayed.
  285.      */
  286.  
  287.     destRect = (*thePrRecHdl)->prInfo.rPage;
  288.     viewRect = destRect;
  289.  
  290.     gPrintTextHdl = TEStylNew( &destRect, &viewRect );
  291.     
  292.     if ( !gPrintTextHdl ){
  293.         PrSetError( memFullErr );
  294.         return;
  295.     }
  296.  
  297. #ifdef NEVER    
  298.     /* Copy the text from the window's TE rec to the printer's TE rec */
  299.     
  300.     winTEHdl = (TEHandle)GetWRefCon( gDocWindow );
  301.  
  302.     textHdl = TEGetText( winTEHdl );
  303.     
  304.     textLen = GetHandleSize( textHdl );
  305.     
  306.     HLock( textHdl );
  307.     TEInsert( *textHdl, textLen, gPrintTextHdl );
  308.     HUnlock( textHdl );
  309.     
  310.     /* Copy the styles from the window's TE rec to the printer's */
  311.  
  312.     oldStart = (*winTEHdl)->selStart;
  313.     oldEnd = (*winTEHdl)->selEnd;
  314.     (*winTEHdl)->selStart = 0;
  315.     (*winTEHdl)->selEnd = 32767;
  316.  
  317.     stylHdl = GetStylHandle( winTEHdl );
  318.  
  319.     (*winTEHdl)->selStart = oldStart;
  320.     (*winTEHdl)->selEnd = oldEnd;
  321.     
  322.     SetStylHandle( stylHdl, gPrintTextHdl );
  323. #endif
  324.  
  325.     return;
  326. }
  327. #endif
  328.